#include "myminimusic.h"
#include "myminimusic.h"
#include "ui_myminimusic.h"
#include <QMouseEvent>
#include <QDebug>
#include <QGraphicsDropShadowEffect>
#include <QJsonObject>
#include <recbox.h>
#include <QFileDialog>
#include <musiclist.h>

MyMiniMusic::MyMiniMusic(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyMiniMusic)
{
    ui->setupUi(this);
    initWindow();
    cnnectSignalAndSlots();
}

MyMiniMusic::~MyMiniMusic()
{
    delete ui;
}

void MyMiniMusic::initWindow()
{
    this->setWindowFlag(Qt::FramelessWindowHint);

    // 设置窗口背景为透明 -- attribute属性 Translucent半透明
    this->setAttribute(Qt::WA_TranslucentBackground);

    QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect();
    // 设置阴影从窗口哪个位置开始向外偏移，(0,0)即为附着在边框上
    shadow->setOffset(0, 0);
    // 设置阴影颜色，这里为黑色
    shadow->setColor("#000000");
    // 设置圆角角度
    shadow->setBlurRadius(10);
    // 把阴影效果设置到窗口上
    this->setGraphicsEffect(shadow);

    // 设置按钮图标和文本
    ui->Rec->setIconAndText(QString(":/images/rec.png"), QString("推荐馆"), 0);
    ui->audio->setIconAndText(QString(":/images/radio.png"), QString("电台馆"), 1);
    ui->music->setIconAndText(QString(":/images/music.png"), QString("音乐馆"), 2);
    ui->like->setIconAndText(QString(":/images/like.png"), QString("我喜欢"), 3);
    ui->local->setIconAndText(QString(":/images/local.png"), QString("本地下载"), 4);
    ui->recent->setIconAndText(QString(":/images/recent.png"), QString("最近播放"), 5);

    // 设置动画效果默认显示在local中
    ui->local->showLineBox();
    ui->stackedWidget->setCurrentIndex(4);

    // 初始化推荐音乐栏
    srand(time(nullptr));
    ui->recMusicBox->initRecBoxUi(randomPicture(), 1);
    ui->supplyMusicBox->initRecBoxUi(randomPicture(), 2);

    // 设置我喜欢、本地音乐、最近播放页面
    ui->likePage->setMusicListType(PageType::LIKE_PAGE);
    ui->likePage->setCommonPageUi("我喜欢", ":/images/ilikebg.png");
    ui->localPage->setMusicListType(PageType::LOCAL_PAGE);
    ui->localPage->setCommonPageUi("本地音乐", ":/images/localbg.png");
    ui->recentPage->setMusicListType(PageType::HISTORY_PAGE);
    ui->recentPage->setCommonPageUi("最近播放", ":/images/recentbg.png");

    // 创建音量调节窗口对象并挂在对象树上
    volumeTool = new VolumeTool(this);

}

void MyMiniMusic::cnnectSignalAndSlots()
{
    connect(ui->Rec, &BtForm::btClick, this, &MyMiniMusic::onBtFormClick);
    connect(ui->audio, &BtForm::btClick, this, &MyMiniMusic::onBtFormClick);
    connect(ui->music, &BtForm::btClick, this, &MyMiniMusic::onBtFormClick);
    connect(ui->like, &BtForm::btClick, this, &MyMiniMusic::onBtFormClick);
    connect(ui->local, &BtForm::btClick, this, &MyMiniMusic::onBtFormClick);
    connect(ui->recent, &BtForm::btClick, this, &MyMiniMusic::onBtFormClick);
}

QJsonArray MyMiniMusic::randomPicture()
{
    // 推荐文本 + 图片路径
    QVector<QString> vecImageName;
    vecImageName << "001.png" << "003.png" << "004.png" << "005.png" << "006.png" << "007.png" << "008.png" << "009.png" << "010.png" << "011.png"
                << "012.png" << "013.png" << "014.png" << "015.png" << "016.png" << "017.png" << "018.png" << "019.png" << "020.png" << "021.png"
                   << "022.png" << "023.png" << "024.png" << "025.png" << "026.png" << "027.png" << "028.png" << "029.png" << "030.png" << "031.png"
                      << "032.png" << "033.png" << "034.png" << "035.png" << "036.png" << "037.png" << "038.png" << "039.png" << "040.png";
    // 打乱容器中的元素顺序
    std::random_shuffle(vecImageName.begin(), vecImageName.end());
    // 001.ong
    // path: ":/images/rec/" + vecImageName[i]
    // text: "推荐-001"
    QJsonArray objArray;
    for(int i = 0; i < vecImageName.size(); i++) {
        QJsonObject obj;
        obj.insert("path", ":/images/rec/" + vecImageName[i]);

        // arg(i, 3, 10, QChar('0'))
        // i: 替换%1位置的内容
        // 3：替换后的内容数值的位数
        // 10: 以10进制替换
        // QChar: 位数不够补0
        QString text = QString("推荐-%1").arg(i, 3, 10, QChar('0'));
        obj.insert("text", text);

        objArray.append(obj);
    }
    return objArray;
}


void MyMiniMusic::on_quit_clicked()
{
    close();
}

void MyMiniMusic::onBtFormClick(int pageId)
{
    // 当按钮点击后清除该索引以外按钮的颜色
    QList<BtForm*> btFormList = this->findChildren<BtForm*>();
    for(auto btForm : btFormList)
    {
        if(btForm->getPageId() != pageId)
        {
            btForm->clearColor();
        }
    }

    // 设置当前stackWidget的索引
    ui->stackedWidget->setCurrentIndex(pageId);
}

// 鼠标移动触发事件
void MyMiniMusic::mouseMoveEvent(QMouseEvent *event)
{
    if(Qt::LeftButton == event->buttons())
    {
        move(event->globalPos() - dragPosition);
        return;
    }
    // 如果上面的if不生效，继续调用基类函数的虚函数
    QWidget::mouseMoveEvent(event);
}

// 鼠标按下触发事件
void MyMiniMusic::mousePressEvent(QMouseEvent *event)
{
    if(Qt::LeftButton == event->button())
    {
        // 获取鼠标相对于窗口左上角的一种距离相对坐标
        // 无论鼠标怎么移动，保证这个全局坐标不会变
        // 所有鼠标移动所在位置坐标减去相对坐标一定是窗口左上角的全局坐标
        dragPosition = event->globalPos() - geometry().topLeft();
        return;
    }
    // 如果上面的if不生效，继续调用基类函数的虚函数
    QWidget::mousePressEvent(event);
}

void MyMiniMusic::on_volume_clicked()
{
    // 先要调节窗口的显示位置，否则该窗口会显示在主窗口的左上角
    // 1.获取该按钮左上角的坐标
    QPoint point = ui->volume->mapToGlobal(QPoint(0, 0));

    // 2.计算volume窗口的左上角位置
    // 让该窗口位于鼠标点击的正上方
    // 鼠标位置：减去窗口宽度的一半，以及高度恰巧就是窗口的左上角
    QPoint volumeLeftTop = point - QPoint(volumeTool->width() / 2, volumeTool->height());

    // 窗口位置微调
    volumeLeftTop.setX(volumeLeftTop.x() + 13);
    volumeLeftTop.setY(volumeLeftTop.y() + 25);
    // 3.移动窗口位置
    volumeTool->move(volumeLeftTop);

    volumeTool->show();

}

void MyMiniMusic::on_addLocal_clicked()
{
    // 1.创建一个文件对话框
    QFileDialog fileDialog(this);
    fileDialog.setWindowTitle("添加本地音乐");

    // 2.设置文件对话框的打开格式
    fileDialog.setAcceptMode(QFileDialog::AcceptOpen);

    // 3.设置对话框模式
    // 只能选择文件，并且一次能够选择多个文件
    fileDialog.setFileMode(QFileDialog::ExistingFiles);

    // 4.设置对话框的mime过滤器
    QStringList mimeList;
    mimeList << "application/octest-stream";
    fileDialog.setMimeTypeFilters(mimeList);

    // 5.设置对话框的默认打开路径, 设置目录为当前工程的工作路径
    QDir dir(QDir::currentPath());
    dir.cdUp();
    QString musicPath = dir.path() + "/MyMiniMusic/musics";
    fileDialog.setDirectory(musicPath);

    // 6.显示对话框，并接收返回值
    // exec内部是死循环处理，模态对话框
    if(fileDialog.exec() == QDialog::Accepted)
    {
        // 切换本地音乐界面，因为加载完的音乐需要再本地音乐界面显示
        ui->stackedWidget->setCurrentIndex(4);

        // 获取对话框的返回值
        QList<QUrl> urls = fileDialog.selectedUrls();

        //拿到歌曲文件后，把歌曲文件交由musicList管理
        // 注意：后续需要将音乐信息添加到数据库，否则每次打开是都需要添加音乐太麻烦了
        musicList.addMusicByUrl(urls);

        // 更新到本地音乐列表
        ui->localPage->reFresh(musicList);
    }
}
